# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-07-31
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.码靓库.手机.手机绘图板 import 手机绘图板
from 神笔码靓.神笔库.元素库 import 元素模板
from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


class 微信聊天窗口制作(手机绘图板):
    def __init__(self, 文件路径, 对方名称="", 背景色="#EDEDED", 描边颜色="#E1E1E1", 显示时间="12:00",
                 显示整机=是,锁屏字体颜色=颜色.白色, 手机颜色="#163844"):
        self.屏幕宽, self.屏幕高 = 1080, 2376
        super(微信聊天窗口制作, self).__init__(作品文件路径=文件路径, 屏幕大小=(self.屏幕宽, self.屏幕高),
                                       显示整机=显示整机, 手机颜色=手机颜色, 显示状态栏=否, 锁屏=否,锁屏字体颜色=锁屏字体颜色)
        # self.画矩形(x=0, y=0, 宽=self.屏幕宽, 高=self.屏幕高, 填充颜色=背景色, 描边宽度=0)
        self.背景色 = 背景色
        self.描边颜色 = 描边颜色
        self.对方名称 = 对方名称
        self.聊天消息开始Y = 307
        self.字体 = 系统字体.微软雅黑  # "安卓字体"
        self.字体大小 = 46
        self.头像宽度 = 108
        self.显示时间 = 显示时间
        self._聊天消息元素 = 列表()

    #
    # def 创作(self):
    #     # self.显示图框()
    #     # self.显示网格()
    #
    #     self.创建屏幕元素()
    #
    #     # self.贴图(x=0, y=0, 图片文件=资源库目录("素材/微信聊天.jpg")).透明度(0.3)

    def 屏幕元素(self):
        屏幕元素_ = 列表()
        self.聊天窗口 = self.创建组合(元素列表=self._聊天消息元素, id_="聊天窗口").添加到列表(屏幕元素_)
        # 顶端状态栏区域
        self.画矩形(x=0, y=0, 宽=self.屏幕宽, 高=110, 填充颜色=颜色.黑色,
                 描边宽度=0).添加到列表(屏幕元素_).重新生成Id()

        self.写字(x=80, y=64, 文字=self.显示时间, 字体大小=40, 字体=self.字体,
                填充颜色=颜色.白色).添加到列表(屏幕元素_).重新生成Id()

        # 对方名称、更多操作区域
        self.画矩形(x=0, y=110, 宽=self.屏幕宽, 高=120, 填充颜色=self.背景色, 描边宽度=0).添加到列表(屏幕元素_).重新生成Id()
        self.写字(x=60, y=110 + 70, 文字="＜", 字体大小=80,
                字体=self.字体).缩放(0.8, 1.2).添加到列表(屏幕元素_).重新生成Id()
        self.写字(x=self.屏幕宽 - 75, y=110 + 50, 文字="...", 字体大小=70,
                字体=self.字体).添加到列表(屏幕元素_).重新生成Id()
        self.写字(x=self.屏幕宽 / 2 - 5, y=178, 文字=self.对方名称, 字体大小=46,
                字体=self.字体, 填充颜色=颜色.黑色).添加到列表(屏幕元素_).重新生成Id()

        # 底端输入区
        self.画矩形(x=0, y=self.屏幕高 - 153, 宽=self.屏幕宽, 高=153,
                 填充颜色="#F7F7F7", 描边颜色=self.描边颜色).添加到列表(屏幕元素_).重新生成Id()  # .透明度(0.5)
        # 底端输入框
        self.画矩形(x=131, y=2247, 宽=711, 高=98,
                 填充颜色=颜色.白色, 描边颜色=self.描边颜色, 圆角半径=3).添加到列表(屏幕元素_).重新生成Id()

        屏幕图标集 = [
            ("增加.svg", 977, 2263, 5),  # SVG图片,x,y,缩放
            ("笑脸.svg", 868, 2263, 3.5),
            ("语音.svg", 25, 2263, 3.5),
            ("蓝牙.svg", 785, 40, 1.5),
            ("信号.svg", 826, 40, 1.8),
            ("4g.svg", 873, 35, 1.8),
            ("5g.svg", 925, 35, 1.8),
            ("电池.svg", 976, 22, 3.6),
            ("眼睛.svg", 150, 30, 3.5),
            ("来电.svg", 224, 35, 0.15),
        ]

        for SVG图片, x, y, 缩放 in 屏幕图标集:
            self.导入SVG为组(SVG图片=资源库目录(f"素材/聊天窗口/{SVG图片}"),
                         x=x, y=y).缩放(缩放).添加到列表(屏幕元素_).重新生成Id()
        # self.连直线(路径点列表=[(0, 55), (self.屏幕宽, 55)], 描边颜色=颜色.白色) # 参考线
        return 屏幕元素_


    def 聊天消息(self, 头像: 元素模板, 文字内容: str, 左, 背景色=None, 边框色=None, 文字颜色=None):
        文字上下边距 = 25
        文字左右边距 = 30
        消息行间距 = 30
        角位移 = 15
        角上距 = 53
        左边距 = 30

        聊天框宽度 = 745
        # 文字列表 = 文字内容.split("\n")
        文字列表 = self.转换行文字(文字内容=文字内容, 最大宽度=聊天框宽度)
        文字行间距 = self.字体大小 * 1.2
        聊天框高度 = 文字行间距 * len(文字列表) + 文字上下边距 * 2
        开始Y = self.聊天消息开始Y
        self.聊天消息开始Y += 聊天框高度 + 消息行间距
        if 文字颜色 is None:
            文字颜色 = 颜色.黑色
        if 左:
            开始X = 左边距 + 126
            if 背景色 is None:
                背景色 = "#FFFFFF"
            if 边框色 is None:
                边框色 = "#EDEDED"
            消息框元素 = self.消息框.左消息框(开始点=(开始X, 开始Y), 消息框宽度=聊天框宽度, 消息框高度=聊天框高度,
                                  背景色=背景色, 边框色=边框色)

            头像X, 头像Y = 左边距, 开始Y - 角上距
            文字X, 文字Y = 开始X + 角位移 + 文字左右边距, 开始Y - 角上距 + 文字上下边距
        else:

            开始X = self.屏幕宽 - 左边距 - 126  # 开始点, 消息框宽度, 消息框高度, 背景色, 边框色
            if 背景色 is None:
                背景色 = "#96EB6A"
            if 边框色 is None:
                边框色 = "#ABDB8F"
            消息框元素 = self.消息框.右消息框(开始点=(开始X, 开始Y), 消息框宽度=聊天框宽度, 消息框高度=聊天框高度,
                                  背景色=背景色, 边框色=边框色)

            头像X, 头像Y = self.屏幕宽 - 左边距 - self.头像宽度, 开始Y - 角上距
            文字X, 文字Y = 开始X - 角位移 - 聊天框宽度 + 文字左右边距, 开始Y - 角上距 + 文字上下边距

        self._聊天消息元素.添加元素(消息框元素)

        if 头像 is None:
            头像框 = self.画矩形(x=头像X, y=头像Y, 宽=self.头像宽度, 高=self.头像宽度, 圆角半径=10,
                           描边宽度=2, 描边颜色=颜色.黑色).透明度(0.2)
            self._聊天消息元素.添加元素(头像框)
        else:
            头像框 = 头像.创造元素().平移(头像X, 头像Y)
            self._聊天消息元素.添加元素(头像框)

        for 索引, 文字 in 索引列举(文字列表):
            消息文字 = self.写字(x=文字X, y=文字Y + 索引 * 文字行间距, 文字=文字, 字体大小=self.字体大小, 字体=self.字体,
                           填充颜色=文字颜色, 水平基线对齐=文字水平基线对齐.起始点对齐, 垂直基线对齐=文字垂直基线对齐.顶线对齐)
            self._聊天消息元素.添加元素(消息文字)

    def 转换行文字(self, 文字内容, 最大宽度):
        最大宽度 = 最大宽度 * 1.15
        if 文字内容.strip() == "":
            return []
        文字内容 = 文字内容 + "\n"
        文字列表 = []
        指针开始, 指针结束 = 0, 0
        跳跃步长 = 1  # 设定跳跃的步长
        文字内容长度 = len(文字内容)

        while 指针开始 < 文字内容长度:

            if 指针结束 <= 指针开始:
                指针结束 += 跳跃步长

            if len(文字内容) > 指针结束:
                if 文字内容[指针结束] in "。，，：！”\"'.:!?？：;、》":
                    指针结束 = 指针结束 + 1
                    if 文字内容[指针结束] in "”":
                        指针结束 = 指针结束 + 1

            截取内容 = 文字内容[指针开始:指针结束]

            if 截取内容.endswith("\n"):
                文字列表.append(截取内容)
                指针开始 = 指针结束
                continue
                # print(".", end="")
                # return 文字列表

            宽, _ = 获取文字的宽高(字体=self.字体, 字体大小=self.字体大小, 文字=截取内容)

            if 宽 <= 最大宽度:
                指针结束 += 1
                continue

            if 跳跃步长 < 2:
                跳跃步长 = len(截取内容) - 2

            文字列表.append(截取内容)
            # print(".", end="")
            指针开始 = 指针结束

        if 文字列表[-1] == "\n":
            return 文字列表[:-1]

        return 文字列表

    def 创建头像模板(self, 图片路径) -> 元素模板:
        头像图片 = self.贴图(x=0, y=0, 图片文件=图片路径)
        宽, 高 = 头像图片.获取图片宽高()
        缩放X, 缩放Y = self.头像宽度 / 宽, self.头像宽度 / 高
        缩放 = 取最小数(缩放X, 缩放Y)
        头像图片 = 头像图片.缩放(缩放)
        if 高 > 宽:
            头像图片.平移((高 - 宽) / 2, 0)
        elif 高 < 宽:
            头像图片.平移(0, (宽 - 高) / 2)
        return self.创建模板(元素列表=[头像图片])

    # def 智能手机已创建(self, 智能手机元素, 屏幕大小, 屏幕位置):
    #     屏幕元素_ = self.创建组合(元素列表=self.屏幕元素())
    #     屏幕元素_.平移(*屏幕位置)
    #     self.屏幕位置 = 屏幕位置

    def 完成前执行(self):
        self.聊天窗口.平移动画(开始时间=3, 持续时间=3, 起点X=0, 起点Y=0, 终点X=0, 终点Y=-250, 重复次数=1)


# if __name__ == '__main__':
#     微信聊天 = 微信聊天窗口制作("微信聊天窗口", 对方名称="Python超人", 显示时间="23:59", 显示整机=是)
#     头像1文件路径 = 资源库目录("图片/三月三印章.png")
#     头像2文件路径 = 资源库目录("图片/Python超人.png")
#
#     头像1 = 微信聊天.创建头像模板(头像1文件路径)
#     头像2 = 微信聊天.创建头像模板(头像2文件路径)
#
#     微信聊天列表 = [
#         ("me", "嘿，你知道无限高清图是什么吗？"),
#         ("pcr", "当然知道！无限高清图又称矢量图，矢量图就像是超级英雄，矢量图放大多少倍，它都不会失真，边缘依然那么清晰，线条还是那么平滑。"),
#         ("me", " 哇，这么厉害！那它是怎么做到的？"),
#         ("pcr", "因为矢量图是用数学公式来描述图形的，而不是像普通图片那样由一个个像素点堆砌起来。"),
#         ("me", "原来是这样，那矢量图一般都用在哪些地方呀？"),
#         ("pcr", "比如说标志设计、图标制作，还有印刷品，因为要保证高质量的输出。"),
#         ("me", "那我以后可得多考虑用矢量图啦！"),
#         ("pcr", "可以的，我做了一个“神笔码靓”，用代码自动来画图，目前已经有很多作品成果，如果不想编程，也可以直接用这些成果。"),
#         ("me", "哦，哪里可以获取到呢？"),
#         ("pcr", "可以搜索关键字“神笔码靓高清图”"),
#         ("me", "哈哈，期待你的大作哦！加油！"),
#         ("pcr", "好的，谢谢！"),
#     ]
#
#     for 谁, 内容 in 微信聊天列表:
#         if 谁 == "me":
#             微信聊天.聊天消息(头像=头像1, 文字内容=内容, 左=False)
#         else:
#             微信聊天.聊天消息(头像=头像2, 文字内容=内容, 左=True)
#
#     微信聊天.完成()
